package com.example.kotlindemo.kotlin

import android.content.SyncRequest
import com.example.kotlindemo.title_utils.Button
import com.example.kotlindemo.title_utils.ButtonOnclick

/**
 * @author Lmy
 * @功能:
 * @Creat 2020/5/15 16:35
 * @Compony 永远相信美好的事物即将发生
 */


/**
 *     list.maxBy { it.length }
 *
 */

fun <T, R : Comparable<R>> List<T>.findMax(black: (T) -> R): T? {

    if (isEmpty()) return null
    var maxElement = get(0)
    //这里其实回调了外层调用的lamd表达式中的it.length
    var maxValue = black(maxElement)
    for (elment in this) {
        val value = black(elment)
        if (value > maxValue) {
            maxElement = elment
            maxValue = value
        }
    }

    return maxElement


}

/**
 * 函数的参数（通常是最后一个）可以用 vararg 修饰符标记
 *
 */
fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts is an Array
        result.add(t)
    return result
}


fun qiuhe(vararg ts: Int): Int {
    var zonghe = 0
    for (value in ts) {
        zonghe = zonghe + value
    }
    return zonghe
}


/**
 *中缀表示法 需要满足 以下三个条件
 * 它们必须是成员函数或扩展函数；
它们必须只有一个参数；
其参数不得接受可变数量的参数且不能有默认值。
 *
 * 调用形式如下    对象 方法名 参数
 */


infix fun Int.zhongzhui(x: Int): Int {

    return 10
}


fun main() {
    1 zhongzhui 2

    var list = listOf("Hello Word", "CCC", "sss", "zoo")
    val a = arrayOf(1, 2, 3)
    print("${asList("5", "1", "10")}\n")
    print("${asList("5", "1", "10")}\n")

    //如果有列表想插入可以直接使用*加入
    print("${asList(1, 2, *a, 3)}\n")
    print("${qiuhe(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)}\n")

    //找出长度最长的单词
    val res = list.maxBy { it.length }

    print("自定义的高阶函数${list.findMax { it.length }}")

    list.maxBy { it.length }

    print("".capitaend())
    Button().setOnClick(object : ButtonOnclick {
        override fun ButtonOnclicklisner() {
        }

    })

    val name1 = 10
    val name2 = 20


    /**
     * 高级函数的引用
     * 第一种调用方式 方法名引用的方式
     */
    nane1Andname2(name1, name2, ::plus)

    /**
     * 匿名方法调用
     *
     */
    nane1Andname2(name1, name2, fun(name1: Int, name2: Int): Int {
        return name2 - name1
    })
    /**
     * 使用lamd表达式来使用
     *这两种写法都是可以的但是 lamd表达式作为最后一个参数的时候可以放到()外面
     */
    nane1Andname2(name1, name2, { a, b -> a + b })
    nane1Andname2(name1, name2) { a, b -> a + b }
}

fun plus(name1: Int, name2: Int): Int {
    return name1 + name2
}

fun minus(name1: Int, name2: Int): Int {
    return name2 - name1
}

fun nane1Andname2(name1: Int, name2: Int, operation: (Int, Int) -> Int): Int {
    return operation(name1, name2)

}


fun String.capitaend(): String {

    if (this.isEmpty()) return ""
    var charArray = this.toCharArray()
    charArray[length - 1] = charArray[length - 1].toUpperCase()
    return String(charArray)
}